/*
 * Projekt: GMU 2013 - Canny hranovy detektor OpenCL/CUDA
 * Autori: Pavel Nevrala - xnevra00 (xnevra00@stud.fit.vutbr.cz)
 *         Martin Jurak - xjurak02 (xjurak02@stud.fit.vutbr.cz)
 */
#pragma once

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <CL/opencl.h>
#include <string.h>

// typ nacteneho obrazku
#define TYPE CV_32F

using namespace cv;
using namespace std;

/*
 * class ImageCL
 * Trida starajici se o nacteni, uchovani a vypis obrazu
 */
class ImageCL
{
public:

	/*
	 * Konstruktor	
	 */
	ImageCL(void);

	/*
	 * Destruktor	 
	 */
	~ImageCL(void);
	
	/*
	 * Nacteni obrazu
	 * @imagePath cesta k obrazu	 
	 */
	void loadImage(const char *imagePath);

	/*
	 * Nacteni obrazu
	 * @imgData buffer s obrazem
	 * @w sirka obrazu
	 * @h vyska obrazu
	 */
	void loadImage(cl_float* imgData, int w, int h);

	/*
	 * Nacteni obrazu
	 * @imageCV obraz v OpenCV strukture	 
	 */
	void loadImage(Mat imageCV);

	/*
	 * Vystup obrazu
	 * @imagePath cesta k obrazu
	 */
	void writeImage(const char *imagePath);

	/*
	 * Vrati obraz pro praci v OpenCL
	 * @return buffer s obrazem
	 */
	cl_float* getImageCL(){return imageData;};	

	/*
	 * Vrati obraz pro praci v OpenCV
	 * @return buffer s obrazem
	 */
	Mat* getImageCV(){return image;};

	/*
	 * Vrati sirku obrazu
	 * @return sirka
	 */
	cl_uint width(){return image->cols;};

	/*
	 * Vrati vysku obrazu
	 * @return vyska
	 */
	cl_uint height(){return image->rows;};

private:
	// obraz pro OpenCV
	Mat* image;
	// obraz pro OpenCL
	cl_float* imageData;

};

